// // 数据库模块
// const mysql = require("mysql2");


// 添加 sqlite3 数据库
const sqlite3 = require("sqlite3").verbose()  // verbose 是什么意思
// 添加相对路径依赖
const path = require("path")
// 添加雪花id 库
const GenId = require("../utils/SnowFlake")

// 创建数据库对象实例
var db = new sqlite3.Database(path.join(__dirname,"blog.sqlite3"))
// 创建雪花id 实例
const genid = new GenId({ WorkerId:1 })

/**
 * 
 * 这句话的意思是给 db 对象添加一个名为 async 的空对象。
 * 通过这样的方式，我们可以在 db 对象上创建一个新的命名空间，用于存储与异步操作相关的方法或属性。
 *
 * 例如，之后可以使用 db.async.all 或 db.async.run 这样的形式来调用与数据库相关的异步方法。
 * 这样做可以将异步操作的方法组织在一个命名空间下，以方便管理和使用。
 */
db.async = {}

// 通过异步的方式访问数据库并执行相关回调函数
db.async.all = (sql,params) => {

    // console.log("sql:" + sql)

    // 访问成功后返回一个 Promist对象，并执行相关回调函数
    return new Promise((resolve,reject) => {
        // 然后执行一次数据库的访问，传递sql语句，相关参数，并产生相关回调函数 
        db.all(sql,params,(err,rows)=>{
            // 访问成功后，执行resolve 方法，并将错误结果和执行数据返回到方法内
            
            // console.log("err:" + err + ": rows:" + rows);

            resolve({err,rows})
         })
    })
}

// 修改和添加执行 run 方法
db.async.run = (sql,params) => {
    // 访问成功后返回一个 Promist对象，并执行相关回调函数
    return new Promise((resolve,reject)=>{
        // 然后执行一次数据库的访问，传递sql语句，相关参数，并产生相关回调函数 
        db.run(sql,params,(err,rows)=>{
            // 访问成功后，执行resolve 方法，并将错误结果和执行数据返回到方法内
            resolve({err,rows})
         })
    })
}

// 将雪花id 和数据库对象导出
module.exports = { db,genid }

